#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
using std::vector;
using std::ifstream;
using std::ofstream;

#define ERROR_CHECK(cond, msg, cleanup) \
    do{ \
        if(cond) { \
            std::cerr << "Error:" << msg << "(" << __FILE__ << ":" << __LINE__ << ")" << std::endl; \
            cleanup; \
            return; \
        } \
    }while(0)

//struct Record
//{
//    string _word;
//    int _frequency;
//};

class Dictionary
{
public:
    void read(const std::string &filename);
    void store(const std::string &filename);
private:
    bool is_word(const string&);
    map<string, int> _dict;
};

bool Dictionary::is_word(const string& word){
    //    for(uint32_t i = 0; i < str.size(); i++){
    //        if(isalpha(str[i]) != true){
    //            return false;
    //        }
    //    }

    //获取的是首元素的迭代器，可以理解为是指向
    //首元素的指针
    auto it = word.begin();
    //不断地移动指针，不断判断每一位是否是数字
    //如果是数字，则直接返回false
    //如果全部遍历一遍，都没有返回false，则最终返回true
    while(it != word.end()){
        if(!isalpha(*it)){
            return false;
        }
        ++it;
    }

    return true;
}

void Dictionary::read(const std::string &filename){
    // 1. 打开文件
    ifstream ifs(filename);
    ERROR_CHECK(!ifs.good(), "ifstream is not good", ifs.close());

    // 2. 存放单词
    string word;
    while(ifs >> word){
        //    while(ifs >> word){
        if(is_word(word)){
            _dict[word]++;
        }
    }

    // 3. 关闭文件
    cout << endl;
    ifs.close();
}

void Dictionary::store(const std::string &filename){
    // 1. 打开文件
    ofstream ofs(filename, std::ios::app);
    ERROR_CHECK(!ofs.good(), "ofs is not good", ofs.close());

    // 2. 打印到屏幕
    auto it = _dict.begin();
    while(it != _dict.end()){
//        if(it->second == true){   // 这句代码会把所有词频为1的内容留下，词频不为1的代码踢出
            cout << it->first <<  " " << it->second << endl;
//        }
        it++;
    }

    // 2. 写入文件
    //    for(int i = 0; i < _dict.size(); i++){
    //        ofs << _dict[i]._word << " "
    //            << _dict[i]._frequency
    //            << endl;
    //    }
//    auto it = _dict.begin();
//    while(it != _dict.end()){
//        ofs << it->first << " " 
//            << it->second 
//            << endl;
//        ++it;
//    }

    ofs.close();
    }

    int main(){
        Dictionary dict;

        dict.read("The_Holy_Bible.txt");
        dict.store("01_Statistic.txt");
    }
